; Firmware from Chinese SB clone, a "Protac AV202P3." ; Reversed and modified to work on genuine SB 1.X cards by ; @TubeTimeUS, 2018/10/05. ; Comments (C) TubeTime ; ; Register/Memory Equates ; .EQU autoinit_magic1, 10h .EQU autoinit_magic2, 11h .EQU dma_len_l_cp, 12h .EQU dma_len_h_cp, 13h .EQU ai_dma_len_l, 14h .EQU ai_dma_len_h, 15h .EQU test_reg, 18h .EQU secret_accum, 19h .EQU secret_rotater, 1ah .EQU buf_counter, 1bh .EQU timer_mode, 1ch .EQU time_constant, 1dh .EQU adpcm_mag, 1eh .EQU misc_flags, 20h .EQU status_bits, 21h .EQU adpcm_buf, 23h .EQU adpcm_sign, 24h ; ; SFR Equates ; .EQU port_dac_out, P1 ; was P2. ; ; SFR bit Equates ; .EQU pin_drequest, 0B5h ; was 90h (p1.0) .EQU pin_dma_enablel, 0B4h ; was 91h (p1.1) .EQU pin_dsp_busy, 0B3h ; was 92h (p1.2) .EQU pin_irequest, 0B2h ; was 93h (p1.3) .EQU pin_dav_dsp, 0A7h ; was 94h (p1.4) .EQU pin_dav_pc, 0A6h ; was 95h (p1.5) .EQU pin_adc_comp, 0A5h ; was 96h (p1.6) .EQU pin_mute_en, 0A0h ; was 97h (p1.7) .EQU pin_dac_0, 090h ; was 0a0h (p2.0) .EQU pin_dac_1, 091h ; was 0a1h (p2.1) .EQU pin_dac_2, 092h ; was 0a2h (p2.2) .EQU pin_dac_3, 093h ; was 0a3h (p2.3) .EQU pin_dac_4, 094h ; was 0a4h (p2.4) .EQU pin_dac_5, 095h ; was 0a5h (p2.5) .EQU pin_dac_6, 096h ; was 0a6h (p2.6) .EQU pin_dac_7, 097h ; was 0a7h (p2.7) ; ; Memory bit Equates ; ;.EQU misc_flags.0, 0 ;.EQU misc_flags.1, 1 ;.EQU misc_flags.2, 2 .EQU use_timer_table, 3 .EQU speaker_status, 8 .EQU flag_dac_silenc, 0bh .EQU flag_dma_dac_2, 0ch .EQU flag_dma_dac_26, 0dh .EQU flag_dma_dac_4, 0eh .EQU flag_dma_dac_8, 0fh ;.EQU adpcm_buf.0, 18h ;.EQU adpcm_buf.1, 19h ;.EQU adpcm_buf.2, 1ah ;.EQU adpcm_buf.3, 1bh ;.EQU adpcm_sign.7, 27h .org 0 ; RESET: ajmp start .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh ; .org 0bh ; TF0_VECTOR: ljmp timer_isr .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh ; .org 30h ; start: mov sp,#30h setb pin_dsp_busy setb pin_dma_enablel setb wr setb rd clr pin_drequest setb pt0 mov th1,#0feh mov tl1,#0feh mov tmod,#22h mov scon,#42h mov pcon,#80h setb ren setb tr1 mov a,#0aah cjne a,autoinit_magic2,cold_boot mov a,#55h cjne a,autoinit_magic1,cold_boot mov autoinit_magic1,#0 mov autoinit_magic2,#0 jnb speaker_status,warm_boot mov port_dac_out,#80h clr pin_mute_en sjmp warm_boot ; cold_boot: mov r0,#40h mov r1,#40h mov r4,#0 mov r6,#2 mov time_constant,#9ch mov secret_accum,#0aah mov secret_rotater,#96h mov status_bits,#0 mov ai_dma_len_l,#0ffh mov ai_dma_len_h,#7 mov port_dac_out,#80h warm_boot: mov r3,#0 mov misc_flags,#0 mov a,time_constant mov th0,a mov tl0,a setb ea clr pin_dsp_busy mov a,#0aah X009a: jb pin_dav_pc,X009a movx @r0,a wait_for_command: jnb pin_dav_dsp,wait_for_command clr tr0 setb pin_dsp_busy movx a,@r0 jbc acc.7,do_cmd_hi mov dptr,#cmd_lo_table rl a jmp @a+dptr ; do_cmd_hi: mov dptr,#cmd_hi_table rl a jmp @a+dptr ; cmd_0_3_nop: clr pin_dsp_busy ajmp wait_for_command ; cmd_4_7_status: clr pin_dsp_busy mov a,status_bits X00bb: jb pin_dav_pc,X00bb movx @r0,a jb pin_dma_enablel,cmd_0_3_nop setb tr0 ajmp wait_for_command ; cmd_8_f: clr pin_dsp_busy X00c8: sjmp X00c8 ; cmd_10_13_direct_dac_8: clr pin_dsp_busy X00cc: jnb pin_dav_dsp,X00cc movx a,@r0 mov port_dac_out,a ajmp wait_for_command ; cmd_14_15_dma_dac_8: jb pin_dma_enablel,X00d9 ajmp update_dma_len ; X00d9: clr pin_dsp_busy X00db: jnb pin_dav_dsp,X00db movx a,@r0 mov r5,a X00e0: jnb pin_dav_dsp,X00e0 movx a,@r0 mov r6,a setb pin_dsp_busy clr pin_dma_enablel mov timer_mode,#0 setb flag_dma_dac_8 ajmp start_timer ; cmd_16_dma_dac_2: jb pin_dma_enablel,X00f5 ajmp update_dma_len ; X00f5: clr pin_dsp_busy X00f7: jnb pin_dav_dsp,X00f7 movx a,@r0 mov r5,a X00fc: jnb pin_dav_dsp,X00fc movx a,@r0 mov r6,a setb pin_dsp_busy clr pin_dma_enablel mov timer_mode,#2 setb flag_dma_dac_2 setb pin_drequest clr pin_drequest X010e: jnb pin_dav_dsp,X010e movx a,@r0 mov adpcm_buf,a mov r3,#4 ajmp start_timer ; cmd_17_dma_dac_2_ref: jb pin_dma_enablel,X011d ajmp update_dma_len ; X011d: clr pin_dsp_busy X011f: jnb pin_dav_dsp,X011f movx a,@r0 mov r5,a X0124: jnb pin_dav_dsp,X0124 movx a,@r0 mov r6,a setb pin_dsp_busy clr pin_dma_enablel mov timer_mode,#2 setb flag_dma_dac_2 setb pin_drequest clr pin_drequest X0136: jnb pin_dav_dsp,X0136 movx a,@r0 mov r2,a mov port_dac_out,a mov r7,#0 mov r3,#1 ajmp start_timer ; cmd_18_19_1c_1d_dma_dac_8_ai: setb misc_flags.0 mov r5,ai_dma_len_l mov r6,ai_dma_len_h clr pin_dma_enablel mov timer_mode,#0 setb flag_dma_dac_8 ajmp start_timer ; cmd_1a_1e: setb misc_flags.0 mov r5,ai_dma_len_l mov r6,ai_dma_len_h clr pin_dma_enablel mov timer_mode,#2 setb flag_dma_dac_2 setb pin_drequest clr pin_drequest X0163: jnb pin_dav_dsp,X0163 movx a,@r0 mov adpcm_buf,a mov r3,#4 ajmp start_timer ; cmd_1b_1f_dma_dac_2_ref_ai: setb misc_flags.0 mov r5,ai_dma_len_l mov r6,ai_dma_len_h clr pin_dma_enablel mov timer_mode,#2 setb flag_dma_dac_2 setb pin_drequest clr pin_drequest X017e: jnb pin_dav_dsp,X017e movx a,@r0 mov r2,a mov port_dac_out,a mov r7,#0 mov r3,#1 ajmp start_timer ; cmd_20_23_direct_adc_8: clr pin_dsp_busy lcall get_adc_sample ajmp wait_for_command ; cmd_24_27_dma_adc_8: clr pin_dsp_busy jnb pin_dma_enablel,X01aa X0197: jnb pin_dav_dsp,X0197 movx a,@r0 mov r5,a X019c: jnb pin_dav_dsp,X019c movx a,@r0 mov r6,a clr pin_dma_enablel setb 21h.2 mov timer_mode,#0ah ajmp start_timer ; X01aa: jnb pin_dav_dsp,X01aa movx a,@r0 mov dma_len_l_cp,a X01b0: jnb pin_dav_dsp,X01b0 movx a,@r0 mov dma_len_h_cp,a setb misc_flags.1 clr pin_dma_enablel setb 21h.2 mov timer_mode,#0ah ajmp start_timer ; cmd_28_2f_direct_adc_8_burst: clr pin_dsp_busy setb misc_flags.0 mov r5,ai_dma_len_l mov r6,ai_dma_len_h clr pin_dma_enablel setb 21h.2 mov timer_mode,#0ah ajmp start_timer ; cmd_38_3f_midi_write_poll: clr pin_dsp_busy X01d4: jnb ti,X01d4 clr ti X01d9: jnb pin_dav_dsp,X01d9 movx a,@r0 setb tr0 mov sbuf,a ljmp wait_for_command ; cmd_30_midi_read_poll: clr pin_dsp_busy jb pin_dma_enablel,do_midi_read_poll setb tr0 ajmp wait_for_command ; do_midi_read_poll: mov a,sbuf clr ri mov a,#40h mov r0,a mov r1,a mov r4,#0 ajmp check_for_ri ; check_for_pc: jnb pin_dav_dsp,check_for_ri movx a,@r0 midi_cmd_term: mov a,#40h mov r0,a mov r1,a mov r4,#0 clr et0 clr tr0 mov autoinit_magic1,#0 mov autoinit_magic2,#0 clr use_timer_table mov tmod,#22h ljmp wait_for_command ; check_for_ri: jb ri,has_data cjne r4,#0,send_data sjmp check_for_pc ; send_data: jb pin_dav_pc,check_for_pc mov a,@r1 inc r1 dec r4 cjne r1,#80h,X0228 mov r1,#40h X0228: movx @r0,a sjmp check_for_pc ; has_data: mov a,sbuf cjne r4,#40h,store_data sjmp X023a ; store_data: mov @r0,a inc r0 inc r4 cjne r0,#80h,X023a mov r0,#40h X023a: clr ri sjmp check_for_pc ; cmd_31_midi_read_int: clr pin_dsp_busy jb pin_dma_enablel,do_midi_read_int setb tr0 ajmp wait_for_command ; do_midi_read_int: mov a,sbuf clr ri mov a,#40h mov r0,a mov r1,a mov r4,#0 ajmp check_for_ri2 ; check_for_pc2: jnb pin_dav_dsp,check_for_ri2 movx a,@r0 ajmp midi_cmd_term ; check_for_ri2: jb ri,has_data2 cjne r4,#0,send_data2 sjmp check_for_pc2 ; send_data2: jb pin_dav_pc,check_for_pc2 mov a,@r1 inc r1 dec r4 cjne r1,#80h,X026c mov r1,#40h X026c: movx @r0,a clr pin_irequest setb pin_irequest sjmp check_for_pc2 ; has_data2: mov a,sbuf cjne r4,#40h,store_data2 sjmp X0282 ; store_data2: mov @r0,a inc r0 inc r4 cjne r0,#80h,X0282 mov r0,#40h X0282: clr ri sjmp check_for_pc2 ; cmd_32_midi_read_timestamp_poll: clr pin_dsp_busy jb pin_dma_enablel,do_midi_read_timestamp_poll setb tr0 ajmp wait_for_command ; do_midi_read_timestamp_poll: mov tmod,#21h setb use_timer_table mov tl0,#17h mov th0,#0fch clr a mov r7,a mov r5,a mov r6,a setb et0 setb tr0 mov a,sbuf clr ri mov a,#40h mov r0,a mov r1,a mov r4,#0 ajmp check_for_ri3 ; check_for_pc3: jnb pin_dav_dsp,check_for_ri3 movx a,@r0 ajmp midi_cmd_term ; check_for_ri3: jb ri,has_data3 cjne r4,#0,send_data3 sjmp check_for_pc3 ; send_data3: jb pin_dav_pc,check_for_pc3 mov a,@r1 inc r1 dec r4 cjne r1,#80h,X02c7 mov r1,#40h X02c7: movx @r0,a sjmp check_for_pc3 ; has_data3: clr tr0 mov a,r7 cjne r4,#40h,store_ts3_r7 sjmp X02da ; store_ts3_r7: mov @r0,a inc r0 inc r4 cjne r0,#80h,X02da mov r0,#40h X02da: mov a,r5 cjne r4,#40h,store_ts3_r5 sjmp X02e8 ; store_ts3_r5: mov @r0,a inc r0 inc r4 cjne r0,#80h,X02e8 mov r0,#40h X02e8: mov a,r6 cjne r4,#40h,store_ts3_r6 sjmp X02f6 ; store_ts3_r6: mov @r0,a inc r0 inc r4 cjne r0,#80h,X02f6 mov r0,#40h X02f6: setb tr0 mov a,sbuf cjne r4,#40h,store_data3 sjmp X0307 ; store_data3: mov @r0,a inc r0 inc r4 cjne r0,#80h,X0307 mov r0,#40h X0307: clr ri sjmp check_for_pc3 ; cmd_33_midi_read_timestamp_int: clr pin_dsp_busy jb pin_dma_enablel,do_midi_read_timestamp_int setb tr0 ajmp wait_for_command ; do_midi_read_timestamp_int: mov tmod,#21h setb use_timer_table mov tl0,#17h mov th0,#0fch clr a mov r7,a mov r5,a mov r6,a setb et0 setb tr0 mov a,sbuf clr ri mov a,#40h mov r0,a mov r1,a mov r4,#0 ajmp check_for_ri4 ; check_for_pc4: jnb pin_dav_dsp,check_for_ri4 movx a,@r0 ajmp midi_cmd_term ; check_for_ri4: jb ri,has_data4 cjne r4,#0,send_data4 sjmp check_for_pc4 ; send_data4: jb pin_dav_pc,check_for_pc4 mov a,@r1 inc r1 dec r4 cjne r1,#80h,X034c mov r1,#40h X034c: movx @r0,a clr pin_irequest setb pin_irequest sjmp check_for_pc4 ; has_data4: clr tr0 mov a,r7 cjne r4,#40h,store_ts4_r7 sjmp X0363 ; store_ts4_r7: mov @r0,a inc r0 inc r4 cjne r0,#80h,X0363 mov r0,#40h X0363: mov a,r5 cjne r4,#40h,store_ts4_r5 sjmp X0371 ; store_ts4_r5: mov @r0,a inc r0 inc r4 cjne r0,#80h,X0371 mov r0,#40h X0371: mov a,r6 cjne r4,#40h,store_ts4_r6 sjmp X037f ; store_ts4_r6: mov @r0,a inc r0 inc r4 cjne r0,#80h,X037f mov r0,#40h X037f: setb tr0 mov a,sbuf cjne r4,#40h,store_data4 sjmp X0390 ; store_data4: mov @r0,a inc r0 inc r4 cjne r0,#80h,X0390 mov r0,#40h X0390: clr ri sjmp check_for_pc4 ; cmd_34_midi_read_poll_write: clr pin_dsp_busy jb pin_dma_enablel,do_midi_read_poll_write setb tr0 ajmp wait_for_command ; do_midi_read_poll_write: mov autoinit_magic1,#55h mov autoinit_magic2,#0aah mov a,sbuf clr ri mov a,#40h mov r0,a mov r1,a mov r4,#0 ajmp check_for_ri5 ; check_for_pc5: jnb pin_dav_dsp,check_for_ri5 movx a,@r0 X03b3: jnb ti,X03b3 clr ti mov sbuf,a check_for_ri5: jb ri,has_data5 cjne r4,#0,send_data5 sjmp check_for_pc5 ; send_data5: jb pin_dav_pc,check_for_pc5 mov a,@r1 inc r1 dec r4 cjne r1,#80h,X03cd mov r1,#40h X03cd: movx @r0,a sjmp check_for_pc5 ; has_data5: mov a,sbuf cjne r4,#40h,store_data5 sjmp X03df ; store_data5: mov @r0,a inc r0 inc r4 cjne r0,#80h,X03df mov r0,#40h X03df: clr ri sjmp check_for_pc5 ; cmd_35_midi_read_int_write_poll: clr pin_dsp_busy jb pin_dma_enablel,do_midi_read_int_write_poll setb tr0 ajmp wait_for_command ; do_midi_read_int_write_poll: mov autoinit_magic1,#55h mov autoinit_magic2,#0aah mov a,sbuf clr ri mov a,#40h mov r0,a mov r1,a mov r4,#0 ajmp check_for_ri6 ; check_for_pc6: jnb pin_dav_dsp,check_for_ri6 movx a,@r0 X0402: jnb ti,X0402 clr ti mov sbuf,a check_for_ri6: jb ri,has_data6 cjne r4,#0,send_data6 sjmp check_for_pc6 ; send_data6: jb pin_dav_pc,check_for_pc6 mov a,@r1 inc r1 dec r4 cjne r1,#80h,X041c mov r1,#40h X041c: movx @r0,a clr pin_irequest setb pin_irequest sjmp check_for_pc6 ; has_data6: mov a,sbuf cjne r4,#40h,store_data6 sjmp X0432 ; store_data6: mov @r0,a inc r0 inc r4 cjne r0,#80h,X0432 mov r0,#40h X0432: clr ri sjmp check_for_pc6 ; cmd_36: clr pin_dsp_busy jb pin_dma_enablel,X043f setb tr0 ajmp wait_for_command ; X043f: mov autoinit_magic1,#55h mov autoinit_magic2,#0aah mov tmod,#21h setb use_timer_table mov tl0,#17h mov th0,#0fch clr a mov r7,a mov r5,a mov r6,a setb et0 setb tr0 mov a,sbuf clr ri mov a,#40h mov r0,a mov r1,a mov r4,#0 ajmp check_for_ri7 ; check_for_pc7: jnb pin_dav_dsp,check_for_ri7 movx a,@r0 X0468: jnb ti,X0468 clr ti mov sbuf,a check_for_ri7: jb ri,has_data7 cjne r4,#0,send_data7 sjmp check_for_pc7 ; send_data7: jb pin_dav_pc,check_for_pc7 mov a,@r1 inc r1 dec r4 cjne r1,#80h,X0482 mov r1,#40h X0482: movx @r0,a sjmp check_for_pc7 ; has_data7: clr tr0 mov a,r7 cjne r4,#40h,store_ts7_r7 sjmp X0495 ; store_ts7_r7: mov @r0,a inc r0 inc r4 cjne r0,#80h,X0495 mov r0,#40h X0495: mov a,r5 cjne r4,#40h,store_ts7_r5 sjmp X04a3 ; store_ts7_r5: mov @r0,a inc r0 inc r4 cjne r0,#80h,X04a3 mov r0,#40h X04a3: mov a,r6 cjne r4,#40h,store_ts7_r6 sjmp X04b1 ; store_ts7_r6: mov @r0,a inc r0 inc r4 cjne r0,#80h,X04b1 mov r0,#40h X04b1: setb tr0 mov a,sbuf cjne r4,#40h,store_data7 sjmp X04c2 ; store_data7: mov @r0,a inc r0 inc r4 cjne r0,#80h,X04c2 mov r0,#40h X04c2: clr ri sjmp check_for_pc7 ; cmd_37_midi_read_timestamp_int_write_poll: clr pin_dsp_busy jb pin_dma_enablel,do_midi_read_timestamp_int_write_poll setb tr0 ajmp wait_for_command ; do_midi_read_timestamp_int_write_poll: mov autoinit_magic1,#55h mov autoinit_magic2,#0aah mov tmod,#21h setb use_timer_table mov tl0,#17h mov th0,#0fch clr a mov r7,a mov r5,a mov r6,a setb et0 setb tr0 mov a,sbuf clr ri mov a,#40h mov r0,a mov r1,a mov r4,#0 ajmp check_for_ri8 ; check_for_pc8: jnb pin_dav_dsp,check_for_ri8 movx a,@r0 X04f8: jnb ti,X04f8 clr ti mov sbuf,a check_for_ri8: jb ri,has_data8 cjne r4,#0,send_data8 sjmp check_for_pc8 ; send_data8: jb pin_dav_pc,check_for_pc8 mov a,@r1 inc r1 dec r4 cjne r1,#80h,X0512 mov r1,#40h X0512: movx @r0,a clr pin_irequest setb pin_irequest sjmp check_for_pc8 ; has_data8: clr tr0 mov a,r7 cjne r4,#40h,store_ts8_r7 sjmp X0529 ; store_ts8_r7: mov @r0,a inc r0 inc r4 cjne r0,#80h,X0529 mov r0,#40h X0529: mov a,r5 cjne r4,#40h,store_ts8_r5 sjmp X0537 ; store_ts8_r5: mov @r0,a inc r0 inc r4 cjne r0,#80h,X0537 mov r0,#40h X0537: mov a,r6 cjne r4,#40h,store_ts8_r6 sjmp X0545 ; store_ts8_r6: mov @r0,a inc r0 inc r4 cjne r0,#80h,X0545 mov r0,#40h X0545: setb tr0 mov a,sbuf cjne r4,#40h,store_data8 sjmp X0556 ; store_data8: mov @r0,a inc r0 inc r4 cjne r0,#80h,X0556 mov r0,#40h X0556: clr ri sjmp check_for_pc8 ; cmd_40_47_set_time_constant: clr pin_dsp_busy jnb pin_dma_enablel,X057e X055f: jnb pin_dav_dsp,X055f movx a,@r0 mov time_constant,a mov tl0,a mov th0,a ajmp wait_for_command ; cmd_48_4f_set_dma_block_size: clr pin_dsp_busy jnb pin_dma_enablel,X057e X0570: jnb pin_dav_dsp,X0570 movx a,@r0 mov ai_dma_len_l,a X0576: jnb pin_dav_dsp,X0576 movx a,@r0 mov ai_dma_len_h,a ajmp wait_for_command ; X057e: setb tr0 ajmp wait_for_command ; cmd_50_52_54_56: clr pin_dsp_busy jnb pin_dma_enablel,X057e clr et0 clr tr0 ajmp wait_for_command ; cmd_51_53_55_57: clr pin_dsp_busy jnb pin_dma_enablel,X057e setb pin_dsp_busy ajmp wait_for_command ; cmd_58_5a_5c_5e: clr pin_dsp_busy jnb pin_dma_enablel,X057e X059b: jnb pin_dav_dsp,X059b movx a,@r0 mov buf_counter,a X05a1: jnb pin_dav_dsp,X05a1 movx a,@r0 X05a5: jnb pin_dav_dsp,X05a5 movx a,@r0 X05a9: jnb pin_dav_dsp,X05a9 movx a,@r0 mov r0,#40h X05af: jnb pin_dav_dsp,X05af movx a,@r0 mov @r0,a inc r0 dec buf_counter djnz buf_counter,X05af mov r1,#40h ajmp wait_for_command ; cmd_59_5b_5d_5f: clr pin_dsp_busy jnb pin_dma_enablel,X057e X05c3: jnb pin_dav_dsp,X05c3 movx a,@r0 mov buf_counter,a X05c9: jnb pin_dav_dsp,X05c9 movx a,@r0 X05cd: jnb pin_dav_dsp,X05cd movx a,@r0 X05d1: jnb pin_dav_dsp,X05d1 movx a,@r0 mov r0,#40h X05d7: jnb pin_dav_dsp,X05d7 movx a,@r0 mov @r0,a inc r0 dec buf_counter djnz buf_counter,X05d7 mov r1,#40h setb pin_dsp_busy ajmp wait_for_command ; cmd_60_63_disable_stereo_in: clr pin_dsp_busy X05ea: ajmp wait_for_command ; cmd_64_67: clr pin_dsp_busy jb pin_dma_enablel,X05ea mov a,status_bits X05f3: jb pin_dav_pc,X05f3 movx @r0,a jb pin_dma_enablel,X05ea setb tr0 ajmp wait_for_command ; cmd_68_6f_enable_stereo_in: clr pin_dsp_busy jb pin_dma_enablel,X05ea X0603: sjmp X0603 ; cmd_70_78_7c: setb misc_flags.0 mov r5,ai_dma_len_l mov r6,ai_dma_len_h sjmp X0620 ; cmd_74_dma_dac_4: jb pin_dma_enablel,X0612 ajmp update_dma_len ; X0612: clr pin_dsp_busy X0614: jnb pin_dav_dsp,X0614 movx a,@r0 mov r5,a X0619: jnb pin_dav_dsp,X0619 movx a,@r0 mov r6,a setb pin_dsp_busy X0620: clr pin_dma_enablel mov timer_mode,#4 setb flag_dma_dac_4 setb pin_drequest clr pin_drequest X062b: jnb pin_dav_dsp,X062b movx a,@r0 mov adpcm_buf,a mov r3,#2 ajmp start_timer ; cmd_71_79_7d: setb misc_flags.0 mov r5,ai_dma_len_l mov r6,ai_dma_len_h sjmp X0650 ; cmd_75_dma_dac_4_ref: jb pin_dma_enablel,X0642 ajmp update_dma_len ; X0642: clr pin_dsp_busy X0644: jnb pin_dav_dsp,X0644 movx a,@r0 mov r5,a X0649: jnb pin_dav_dsp,X0649 movx a,@r0 mov r6,a setb pin_dsp_busy X0650: clr pin_dma_enablel mov timer_mode,#4 setb flag_dma_dac_4 setb pin_drequest clr pin_drequest X065b: jnb pin_dav_dsp,X065b movx a,@r0 mov r2,a mov port_dac_out,a mov r7,#0 mov r3,#1 ajmp start_timer ; cmd_72_7a_7e: setb misc_flags.0 mov r5,ai_dma_len_l mov r6,ai_dma_len_h sjmp X0683 ; cmd_76_dma_dac_2_6: jb pin_dma_enablel,X0675 ajmp update_dma_len ; X0675: clr pin_dsp_busy X0677: jnb pin_dav_dsp,X0677 movx a,@r0 mov r5,a X067c: jnb pin_dav_dsp,X067c movx a,@r0 mov r6,a setb pin_dsp_busy X0683: clr pin_dma_enablel mov timer_mode,#6 setb flag_dma_dac_26 setb pin_drequest clr pin_drequest X068e: jnb pin_dav_dsp,X068e movx a,@r0 mov adpcm_buf,a mov r3,#3 ajmp start_timer ; cmd_73_7b_7f: setb misc_flags.0 mov r5,ai_dma_len_l mov r6,ai_dma_len_h sjmp X06b3 ; cmd_77_dma_dac_2_6_ref: jb pin_dma_enablel,X06a5 ajmp update_dma_len ; X06a5: clr pin_dsp_busy X06a7: jnb pin_dav_dsp,X06a7 movx a,@r0 mov r5,a X06ac: jnb pin_dav_dsp,X06ac movx a,@r0 mov r6,a setb pin_dsp_busy X06b3: clr pin_dma_enablel mov timer_mode,#6 setb flag_dma_dac_26 setb pin_drequest clr pin_drequest X06be: jnb pin_dav_dsp,X06be movx a,@r0 mov r2,a mov port_dac_out,a mov r7,#0 mov r3,#1 ajmp start_timer ; cmd_lo_table: ajmp cmd_0_3_nop ; ajmp cmd_0_3_nop ; ajmp cmd_0_3_nop ; ajmp cmd_0_3_nop ; ajmp cmd_4_7_status ; ajmp cmd_4_7_status ; ajmp cmd_4_7_status ; ajmp cmd_4_7_status ; ajmp cmd_8_f ; ajmp cmd_8_f ; ajmp cmd_8_f ; ajmp cmd_8_f ; ajmp cmd_8_f ; ajmp cmd_8_f ; ajmp cmd_8_f ; ajmp cmd_8_f ; ajmp cmd_10_13_direct_dac_8 ; ajmp cmd_10_13_direct_dac_8 ; ajmp cmd_10_13_direct_dac_8 ; ajmp cmd_10_13_direct_dac_8 ; ajmp cmd_14_15_dma_dac_8 ; ajmp cmd_14_15_dma_dac_8 ; ajmp cmd_16_dma_dac_2 ; ajmp cmd_17_dma_dac_2_ref ; ajmp cmd_18_19_1c_1d_dma_dac_8_ai ; ajmp cmd_18_19_1c_1d_dma_dac_8_ai ; ajmp cmd_1a_1e ; ajmp cmd_1b_1f_dma_dac_2_ref_ai ; ajmp cmd_18_19_1c_1d_dma_dac_8_ai ; ajmp cmd_18_19_1c_1d_dma_dac_8_ai ; ajmp cmd_1a_1e ; ajmp cmd_1b_1f_dma_dac_2_ref_ai ; ajmp cmd_20_23_direct_adc_8 ; ajmp cmd_20_23_direct_adc_8 ; ajmp cmd_20_23_direct_adc_8 ; ajmp cmd_20_23_direct_adc_8 ; ajmp cmd_24_27_dma_adc_8 ; ajmp cmd_24_27_dma_adc_8 ; ajmp cmd_24_27_dma_adc_8 ; ajmp cmd_24_27_dma_adc_8 ; ajmp cmd_28_2f_direct_adc_8_burst ; ajmp cmd_28_2f_direct_adc_8_burst ; ajmp cmd_28_2f_direct_adc_8_burst ; ajmp cmd_28_2f_direct_adc_8_burst ; ajmp cmd_28_2f_direct_adc_8_burst ; ajmp cmd_28_2f_direct_adc_8_burst ; ajmp cmd_28_2f_direct_adc_8_burst ; ajmp cmd_28_2f_direct_adc_8_burst ; ajmp cmd_30_midi_read_poll ; ajmp cmd_31_midi_read_int ; ajmp cmd_32_midi_read_timestamp_poll ; ajmp cmd_33_midi_read_timestamp_int ; ajmp cmd_34_midi_read_poll_write ; ajmp cmd_35_midi_read_int_write_poll ; ajmp cmd_36 ; ajmp cmd_37_midi_read_timestamp_int_write_poll ; ajmp cmd_38_3f_midi_write_poll ; ajmp cmd_38_3f_midi_write_poll ; ajmp cmd_38_3f_midi_write_poll ; ajmp cmd_38_3f_midi_write_poll ; ajmp cmd_38_3f_midi_write_poll ; ajmp cmd_38_3f_midi_write_poll ; ajmp cmd_38_3f_midi_write_poll ; ajmp cmd_38_3f_midi_write_poll ; ajmp cmd_40_47_set_time_constant ; ajmp cmd_40_47_set_time_constant ; ajmp cmd_40_47_set_time_constant ; ajmp cmd_40_47_set_time_constant ; ajmp cmd_40_47_set_time_constant ; ajmp cmd_40_47_set_time_constant ; ajmp cmd_40_47_set_time_constant ; ajmp cmd_40_47_set_time_constant ; ajmp cmd_48_4f_set_dma_block_size ; ajmp cmd_48_4f_set_dma_block_size ; ajmp cmd_48_4f_set_dma_block_size ; ajmp cmd_48_4f_set_dma_block_size ; ajmp cmd_48_4f_set_dma_block_size ; ajmp cmd_48_4f_set_dma_block_size ; ajmp cmd_48_4f_set_dma_block_size ; ajmp cmd_48_4f_set_dma_block_size ; ajmp cmd_50_52_54_56 ; ajmp cmd_51_53_55_57 ; ajmp cmd_50_52_54_56 ; ajmp cmd_51_53_55_57 ; ajmp cmd_50_52_54_56 ; ajmp cmd_51_53_55_57 ; ajmp cmd_50_52_54_56 ; ajmp cmd_51_53_55_57 ; ajmp cmd_58_5a_5c_5e ; ajmp cmd_59_5b_5d_5f ; ajmp cmd_58_5a_5c_5e ; ajmp cmd_59_5b_5d_5f ; ajmp cmd_58_5a_5c_5e ; ajmp cmd_59_5b_5d_5f ; ajmp cmd_58_5a_5c_5e ; ajmp cmd_59_5b_5d_5f ; ajmp cmd_60_63_disable_stereo_in ; ajmp cmd_60_63_disable_stereo_in ; ajmp cmd_60_63_disable_stereo_in ; ajmp cmd_60_63_disable_stereo_in ; ajmp cmd_64_67 ; ajmp cmd_64_67 ; ajmp cmd_64_67 ; ajmp cmd_64_67 ; ajmp cmd_68_6f_enable_stereo_in ; ajmp cmd_68_6f_enable_stereo_in ; ajmp cmd_68_6f_enable_stereo_in ; ajmp cmd_68_6f_enable_stereo_in ; ajmp cmd_68_6f_enable_stereo_in ; ajmp cmd_68_6f_enable_stereo_in ; ajmp cmd_68_6f_enable_stereo_in ; ajmp cmd_68_6f_enable_stereo_in ; ajmp cmd_70_78_7c ; ajmp cmd_71_79_7d ; ajmp cmd_72_7a_7e ; ajmp cmd_73_7b_7f ; ajmp cmd_74_dma_dac_4 ; ajmp cmd_75_dma_dac_4_ref ; ajmp cmd_76_dma_dac_2_6 ; ajmp cmd_77_dma_dac_2_6_ref ; ajmp cmd_70_78_7c ; ajmp cmd_71_79_7d ; ajmp cmd_72_7a_7e ; ajmp cmd_73_7b_7f ; ajmp cmd_70_78_7c ; ajmp cmd_71_79_7d ; ajmp cmd_72_7a_7e ; ajmp cmd_73_7b_7f ; update_dma_len: clr pin_dsp_busy X07cd: jnb pin_dav_dsp,X07cd movx a,@r0 mov dma_len_l_cp,a X07d3: jnb pin_dav_dsp,X07d3 movx a,@r0 mov dma_len_h_cp,a setb misc_flags.1 setb et0 setb tr0 ajmp wait_for_command ; start_timer: clr pin_dsp_busy setb et0 setb tr0 ajmp wait_for_command .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh ; .org 801h ; .db '('+80h,'C'+80h,')'+80h,'1'+80h,'9'+80h,'9'+80h .db '2'+80h,' '+80h,'A'+80h,'n'+80h,'c'+80h,'h'+80h .db 'o'+80h,'r'+80h,' '+80h,'E'+80h,'l'+80h,'e'+80h .db 'c'+80h,'t'+80h,'r'+80h,'o'+80h,'n'+80h,'i'+80h .db 'c'+80h,'s'+80h,' '+80h,'C'+80h,'o'+80h,'.'+80h .db ','+80h,0 adpcm_table: .db 0,1,2,3,4,5,6,7 .db 8,9,0ah,0bh,0ch,0dh,0eh,0fh .db 1,3,5,7,9,0bh,0dh,0fh .db 11h,13h,15h,17h,19h,1bh,1dh,1fh .db 2,6,0ah,0eh,12h,16h,1ah,1eh .db 22h,26h,2ah,2eh,32h,36h,3ah,3eh .db 4,0ch,14h,1ch,24h,2ch,34h,3ch .db 44h,4ch,54h,5ch,64h,6ch,74h,7ch .db 8,18h,28h,38h,48h,58h,68h,78h .db 88h,98h,0a8h,0b8h,0c8h,0d8h,0e8h,0f8h .db 10h,30h,50h,70h,90h,0b0h,0d0h,0f0h .db 10h,30h,50h,70h,90h,0b0h,0d0h,0f0h .db 20h,60h,0a0h,0e0h,20h,60h,0a0h,0e0h .db 20h,60h,0a0h,0e0h,20h,60h,0a0h,0e0h .db 40h,0c0h,40h,0c0h,40h,0c0h,40h,0c0h .db 40h,0c0h,40h,0c0h,40h,0c0h,40h,0c0h ; cmd_80_8f_silence_dac: clr pin_dsp_busy jb pin_dma_enablel,X08ab setb tr0 ljmp wait_for_command ; X08ab: clr pin_dma_enablel X08ad: jnb pin_dav_dsp,X08ad movx a,@r0 mov r5,a X08b2: jnb pin_dav_dsp,X08b2 movx a,@r0 mov r6,a mov timer_mode,#8 setb flag_dac_silenc ljmp start_timer ; cmd_90_92_94_96_auto_init_dma_hs: mov autoinit_magic1,#55h mov autoinit_magic2,#0aah clr pin_dma_enablel clr et0 setb tr0 clr tf0 X08cd: mov r5,ai_dma_len_l mov r6,ai_dma_len_h X08d1: jnb tf0,X08d1 clr tf0 setb pin_drequest clr pin_drequest X08da: jnb pin_dav_dsp,X08da movx a,@r0 mov port_dac_out,a cjne r5,#0,X08ed cjne r6,#0,X08ec clr pin_irequest setb pin_irequest sjmp X08cd ; X08ec: dec r6 X08ed: dec r5 sjmp X08d1 ; cmd_91_93_95_97: mov autoinit_magic1,#55h mov autoinit_magic2,#0aah clr pin_dma_enablel clr et0 setb tr0 clr tf0 mov r5,ai_dma_len_l mov r6,ai_dma_len_h X0902: jnb tf0,X0902 clr tf0 setb pin_drequest clr pin_drequest X090b: jnb pin_dav_dsp,X090b movx a,@r0 mov port_dac_out,a cjne r5,#0,X091e cjne r6,#0,X091d clr pin_irequest setb pin_irequest sjmp X097d ; X091d: dec r6 X091e: dec r5 sjmp X0902 ; cmd_98_9a_9c_9e_auto_init_adc_hs: mov autoinit_magic1,#55h mov autoinit_magic2,#0aah clr pin_dma_enablel clr et0 setb tr0 clr tf0 X092f: mov r5,ai_dma_len_l mov r6,ai_dma_len_h X0933: jnb tf0,X0933 clr tf0 lcall get_adc_sample setb pin_drequest clr pin_drequest cjne r5,#0,X094c cjne r6,#0,X094b clr pin_irequest setb pin_irequest sjmp X092f ; X094b: dec r6 X094c: dec r5 sjmp X0933 ; cmd_99_9b_9d_9f: mov autoinit_magic1,#55h mov autoinit_magic2,#0aah clr pin_dma_enablel clr et0 setb tr0 clr tf0 mov r5,ai_dma_len_l mov r6,ai_dma_len_h X0961: jnb tf0,X0961 clr tf0 lcall get_adc_sample setb pin_drequest clr pin_drequest cjne r5,#0,X097a cjne r6,#0,X0979 clr pin_irequest setb pin_irequest sjmp X097d ; X0979: dec r6 X097a: dec r5 sjmp X0961 ; X097d: clr a mov autoinit_magic1,a mov autoinit_magic2,a clr tr0 setb pin_dma_enablel clr pin_dsp_busy ljmp wait_for_command ; cmd_d0_d2_halt_dma: clr et0 clr tr0 setb pin_dma_enablel sjmp bail_special_cmd ; cmd_d1_enable_speaker: clr pin_dsp_busy mov port_dac_out,#0 clr pin_mute_en setb speaker_status clr a X099d: mov port_dac_out,a inc a mov r3,#31h X09a2: djnz r3,X09a2 cjne a,#81h,X099d sjmp bail_special_cmd ; cmd_d3_disable_speaker: clr pin_dsp_busy mov a,port_dac_out X09ad: mov r3,#30h X09af: djnz r3,X09af jz X09b8 mov port_dac_out,a dec a sjmp X09ad ; X09b8: setb pin_mute_en clr speaker_status sjmp bail_special_cmd ; cmd_d4_d7_dc_df_dma_continue: clr pin_dma_enablel setb et0 setb tr0 sjmp bail_special_cmd ; cmd_d8_d9_speaker_status: clr a jb pin_mute_en,X09cb cpl a X09cb: jb pin_dav_pc,X09cb movx @r0,a sjmp bail_special_cmd ; cmd_da_db_exit_auto_init_dma: setb misc_flags.2 bail_special_cmd: clr pin_dsp_busy jnb et0,X09da setb tr0 X09da: ljmp wait_for_command ; cmd_e0_dsp_ident: clr pin_dsp_busy jnb pin_dma_enablel,X0a4c X09e2: jnb pin_dav_dsp,X09e2 movx a,@r0 cpl a X09e7: jb pin_dav_pc,X09e7 movx @r0,a ljmp wait_for_command ; cmd_e1_dsp_version: clr pin_dsp_busy jnb pin_dma_enablel,X0a4c mov a,#2 X09f5: jb pin_dav_pc,X09f5 movx @r0,a mov a,#1 X09fb: jb pin_dav_pc,X09fb movx @r0,a ljmp wait_for_command ; cmd_e2_e3_dsp_copyright: clr pin_dsp_busy jnb pin_dma_enablel,X0a4c X0a07: jnb pin_dav_dsp,X0a07 movx a,@r0 setb pin_dsp_busy clr pin_dma_enablel xrl a,secret_rotater add a,secret_accum mov secret_accum,a mov a,secret_rotater rr a rr a mov secret_rotater,a mov a,secret_accum X0a1d: jb pin_dav_pc,X0a1d movx @r0,a setb pin_drequest clr pin_drequest X0a25: jb pin_dav_pc,X0a25 nop setb pin_dma_enablel clr pin_dsp_busy ljmp wait_for_command ; cmd_e4_e7_write_test_reg: clr pin_dsp_busy jnb pin_dma_enablel,X0a4c X0a35: jnb pin_dav_dsp,X0a35 movx a,@r0 mov test_reg,a ljmp wait_for_command ; cmd_e8_ef_read_test_reg: clr pin_dsp_busy jnb pin_dma_enablel,X0a4c mov a,test_reg X0a45: jb pin_dav_pc,X0a45 movx @r0,a ljmp wait_for_command ; X0a4c: setb tr0 ljmp wait_for_command ; cmd_f0_sine_generator: clr pin_dsp_busy jnb pin_dma_enablel,X0a4c mov r0,#40h mov dptr,#sine_table X0a5b: mov a,r0 movc a,@a+dptr mov @r0,a inc r0 cjne r0,#80h,X0a5b mov r1,#40h mov r6,#8 mov th0,#0c2h mov timer_mode,#0ch clr pin_mute_en setb et0 setb tr0 ljmp wait_for_command ; cmd_f1_dsp_aux_status: clr pin_dsp_busy jnb pin_dma_enablel,X0a4c mov a,#0ffh mov c,pin_mute_en mov acc.0,c mov c,pin_adc_comp mov acc.5,c mov c,pin_dav_pc mov acc.6,c mov c,pin_dav_dsp mov acc.7,c X0a8c: jb pin_dav_pc,X0a8c movx @r0,a ljmp wait_for_command ; cmd_f2_f3_irq_request: clr pin_dsp_busy jnb pin_dma_enablel,X0a4c clr pin_irequest setb pin_irequest ljmp wait_for_command ; cmd_f4_f7: clr pin_dsp_busy jnb pin_dma_enablel,X0a4c mov a,#0dah movx @r0,a mov a,#0f4h X0aa9: jb pin_dav_pc,X0aa9 movx @r0,a ljmp wait_for_command ; cmd_f8_ff_dsp_aux2_status: clr pin_dsp_busy jnb pin_dma_enablel,X0a4c mov r0,#7fh mov a,#55h X0ab9: mov @r0,a cjne @r0,#55h,X0ac9 djnz r0,X0ab9 mov r0,#7fh mov a,#0aah X0ac3: mov @r0,a cjne @r0,#0aah,X0ac9 djnz r0,X0ac3 X0ac9: mov a,r0 movx @r0,a ljmp wait_for_command ; cmd_hi_table: ajmp cmd_80_8f_silence_dac ; ajmp cmd_80_8f_silence_dac ; ajmp cmd_80_8f_silence_dac ; ajmp cmd_80_8f_silence_dac ; ajmp cmd_80_8f_silence_dac ; ajmp cmd_80_8f_silence_dac ; ajmp cmd_80_8f_silence_dac ; ajmp cmd_80_8f_silence_dac ; ajmp cmd_80_8f_silence_dac ; ajmp cmd_80_8f_silence_dac ; ajmp cmd_80_8f_silence_dac ; ajmp cmd_80_8f_silence_dac ; ajmp cmd_80_8f_silence_dac ; ajmp cmd_80_8f_silence_dac ; ajmp cmd_80_8f_silence_dac ; ajmp cmd_80_8f_silence_dac ; ajmp cmd_90_92_94_96_auto_init_dma_hs ; ajmp cmd_91_93_95_97 ; ajmp cmd_90_92_94_96_auto_init_dma_hs ; ajmp cmd_91_93_95_97 ; ajmp cmd_90_92_94_96_auto_init_dma_hs ; ajmp cmd_91_93_95_97 ; ajmp cmd_90_92_94_96_auto_init_dma_hs ; ajmp cmd_91_93_95_97 ; ajmp cmd_98_9a_9c_9e_auto_init_adc_hs ; ajmp cmd_99_9b_9d_9f ; ajmp cmd_98_9a_9c_9e_auto_init_adc_hs ; ajmp cmd_99_9b_9d_9f ; ajmp cmd_98_9a_9c_9e_auto_init_adc_hs ; ajmp cmd_99_9b_9d_9f ; ajmp cmd_98_9a_9c_9e_auto_init_adc_hs ; ajmp cmd_99_9b_9d_9f ; ajmp cmd_a0_a3_b0_b3_c0_c3_disable_stereo_in ; ajmp cmd_a0_a3_b0_b3_c0_c3_disable_stereo_in ; ajmp cmd_a0_a3_b0_b3_c0_c3_disable_stereo_in ; ajmp cmd_a0_a3_b0_b3_c0_c3_disable_stereo_in ; ajmp cmd_a4_a7_b4_b7_c4_c7 ; ajmp cmd_a4_a7_b4_b7_c4_c7 ; ajmp cmd_a4_a7_b4_b7_c4_c7 ; ajmp cmd_a4_a7_b4_b7_c4_c7 ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a0_a3_b0_b3_c0_c3_disable_stereo_in ; ajmp cmd_a0_a3_b0_b3_c0_c3_disable_stereo_in ; ajmp cmd_a0_a3_b0_b3_c0_c3_disable_stereo_in ; ajmp cmd_a0_a3_b0_b3_c0_c3_disable_stereo_in ; ajmp cmd_a4_a7_b4_b7_c4_c7 ; ajmp cmd_a4_a7_b4_b7_c4_c7 ; ajmp cmd_a4_a7_b4_b7_c4_c7 ; ajmp cmd_a4_a7_b4_b7_c4_c7 ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a0_a3_b0_b3_c0_c3_disable_stereo_in ; ajmp cmd_a0_a3_b0_b3_c0_c3_disable_stereo_in ; ajmp cmd_a0_a3_b0_b3_c0_c3_disable_stereo_in ; ajmp cmd_a0_a3_b0_b3_c0_c3_disable_stereo_in ; ajmp cmd_a4_a7_b4_b7_c4_c7 ; ajmp cmd_a4_a7_b4_b7_c4_c7 ; ajmp cmd_a4_a7_b4_b7_c4_c7 ; ajmp cmd_a4_a7_b4_b7_c4_c7 ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_a8_af_b8_bf_c8_cf_enable_stereo_in ; ajmp cmd_d0_d2_halt_dma ; ajmp cmd_d1_enable_speaker ; ajmp cmd_d0_d2_halt_dma ; ajmp cmd_d3_disable_speaker ; ajmp cmd_d4_d7_dc_df_dma_continue ; ajmp cmd_d4_d7_dc_df_dma_continue ; ajmp cmd_d4_d7_dc_df_dma_continue ; ajmp cmd_d4_d7_dc_df_dma_continue ; ajmp cmd_d8_d9_speaker_status ; ajmp cmd_d8_d9_speaker_status ; ajmp cmd_da_db_exit_auto_init_dma ; ajmp cmd_da_db_exit_auto_init_dma ; ajmp cmd_d4_d7_dc_df_dma_continue ; ajmp cmd_d4_d7_dc_df_dma_continue ; ajmp cmd_d4_d7_dc_df_dma_continue ; ajmp cmd_d4_d7_dc_df_dma_continue ; ajmp cmd_e0_dsp_ident ; ajmp cmd_e1_dsp_version ; ajmp cmd_e2_e3_dsp_copyright ; ajmp cmd_e2_e3_dsp_copyright ; ajmp cmd_e4_e7_write_test_reg ; ajmp cmd_e4_e7_write_test_reg ; ajmp cmd_e4_e7_write_test_reg ; ajmp cmd_e4_e7_write_test_reg ; ajmp cmd_e8_ef_read_test_reg ; ajmp cmd_e8_ef_read_test_reg ; ajmp cmd_e8_ef_read_test_reg ; ajmp cmd_e8_ef_read_test_reg ; ajmp cmd_e8_ef_read_test_reg ; ajmp cmd_e8_ef_read_test_reg ; ajmp cmd_e8_ef_read_test_reg ; ajmp cmd_e8_ef_read_test_reg ; ajmp cmd_f0_sine_generator ; ajmp cmd_f1_dsp_aux_status ; ajmp cmd_f2_f3_irq_request ; ajmp cmd_f2_f3_irq_request ; ajmp cmd_f4_f7 ; ajmp cmd_f4_f7 ; ajmp cmd_f4_f7 ; ajmp cmd_f4_f7 ; ajmp cmd_f8_ff_dsp_aux2_status ; ajmp cmd_f8_ff_dsp_aux2_status ; ajmp cmd_f8_ff_dsp_aux2_status ; ajmp cmd_f8_ff_dsp_aux2_status ; ajmp cmd_f8_ff_dsp_aux2_status ; ajmp cmd_f8_ff_dsp_aux2_status ; ajmp cmd_f8_ff_dsp_aux2_status ; ajmp cmd_f8_ff_dsp_aux2_status ; timer_jump_table: ajmp isr_dma_dac_8 ; ajmp isr_dma_dac_2 ; ajmp isr_dma_dac_4 ; ajmp isr_dma_dac_26 ; ajmp isr_silence_gen ; ajmp isr_dma_adc_8 ; ajmp isr_sine_gen ; reti ; cmd_a0_a3_b0_b3_c0_c3_disable_stereo_in: ljmp cmd_60_63_disable_stereo_in ; cmd_a4_a7_b4_b7_c4_c7: ljmp cmd_64_67 ; cmd_a8_af_b8_bf_c8_cf_enable_stereo_in: ljmp cmd_68_6f_enable_stereo_in ; finished_dma_op: clr misc_flags.2 clr misc_flags.1 clr misc_flags.0 clr et0 clr tr0 clr pin_irequest setb pin_irequest setb pin_dma_enablel clr pin_dsp_busy reti ; adc_dac8_auto_init_isr: mov r5,ai_dma_len_l mov r6,ai_dma_len_h clr pin_irequest setb pin_irequest clr pin_dsp_busy reti ; adc_dac8_auto_once_isr: mov r5,dma_len_l_cp mov r6,dma_len_h_cp clr misc_flags.1 clr misc_flags.0 clr pin_irequest setb pin_irequest clr pin_dsp_busy reti ; prep_next_autoinit_dma_adpcm: mov r5,ai_dma_len_l mov r6,ai_dma_len_h setb pin_drequest clr pin_drequest X0c1b: jnb pin_dav_dsp,X0c1b movx a,@r0 mov adpcm_buf,a clr pin_irequest setb pin_irequest clr pin_dsp_busy reti ; prep_last_autoinit_dma_adpcm: mov r5,dma_len_l_cp mov r6,dma_len_h_cp clr misc_flags.1 clr misc_flags.0 setb pin_drequest clr pin_drequest X0c34: jnb pin_dav_dsp,X0c34 movx a,@r0 mov adpcm_buf,a clr pin_irequest setb pin_irequest clr pin_dsp_busy reti ; dac8_isr_jump_table: ajmp dac8_default_isr ; ajmp adc_dac8_auto_init_isr ; ajmp adc_dac8_auto_once_isr ; ajmp adc_dac8_auto_once_isr ; ajmp dac8_default_isr ; ajmp dac8_default_isr ; ajmp dac8_default_isr ; ajmp dac8_default_isr ; dac2_isr_jump_table: ajmp dac2_default_isr ; ajmp dac2_auto_init_isr ; ajmp dac2_auto_once_isr ; ajmp dac2_auto_once_isr ; ajmp dac2_default_isr ; ajmp dac2_default_isr ; ajmp dac2_default_isr ; ajmp dac2_default_isr ; dac4_isr_jump_table: ajmp dac4_default_isr ; ajmp dac4_auto_init_isr ; ajmp dac4_auto_once_isr ; ajmp dac4_auto_once_isr ; ajmp dac4_default_isr ; ajmp dac4_default_isr ; ajmp dac4_default_isr ; ajmp dac4_default_isr ; dac26_isr_jump_table: ajmp dac26_default_isr ; ajmp dac26_auto_init_isr ; ajmp dac26_auto_once_isr ; ajmp dac26_auto_once_isr ; ajmp dac26_default_isr ; ajmp dac26_default_isr ; ajmp dac26_default_isr ; ajmp dac26_default_isr ; adc8_isr_jump_table: ajmp adc8_default_isr ; ajmp adc_dac8_auto_init_isr ; ajmp adc_dac8_auto_once_isr ; ajmp adc_dac8_auto_once_isr ; ajmp adc8_default_isr ; ajmp adc8_default_isr ; ajmp adc8_default_isr ; ajmp adc8_default_isr ; get_adc_sample: mov port_dac_out,#80h nop jnb pin_adc_comp,X0c9a clr pin_dac_7 X0c9a: setb pin_dac_6 nop jnb pin_adc_comp,X0ca2 clr pin_dac_6 X0ca2: setb pin_dac_5 nop jnb pin_adc_comp,X0caa clr pin_dac_5 X0caa: setb pin_dac_4 nop jnb pin_adc_comp,X0cb2 clr pin_dac_4 X0cb2: setb pin_dac_3 nop jnb pin_adc_comp,X0cba clr pin_dac_3 X0cba: setb pin_dac_2 nop jnb pin_adc_comp,X0cc2 clr pin_dac_2 X0cc2: setb pin_dac_1 nop jnb pin_adc_comp,X0cca clr pin_dac_1 X0cca: setb pin_dac_0 nop jnb pin_adc_comp,X0cd2 clr pin_dac_0 X0cd2: mov a,port_dac_out X0cd4: jb pin_dav_pc,X0cd4 movx @r0,a ret ; timer_isr: jnb use_timer_table,do_timer_jump inc r7 cjne r7,#0,timerskip1 inc r5 cjne r5,#0,timerskip1 inc r6 timerskip1: mov tl0,#17h mov th0,#0fch reti ; do_timer_jump: setb pin_dsp_busy mov dptr,#timer_jump_table mov a,timer_mode anl a,#0eh jmp @a+dptr ; isr_dma_dac_8: jnb pin_dav_dsp,X0cfc clr pin_dsp_busy reti ; X0cfc: setb pin_drequest clr pin_drequest X0d00: jnb pin_dav_dsp,X0d00 movx a,@r0 mov port_dac_out,a cjne r5,#0,X0d1a cjne r6,#0,X0d19 mov a,misc_flags anl a,#7 rl a mov dptr,#dac8_isr_jump_table jmp @a+dptr ; dac8_default_isr: clr flag_dma_dac_8 ajmp finished_dma_op ; X0d19: dec r6 X0d1a: dec r5 clr pin_dsp_busy reti ; isr_dma_dac_2: jnb pin_dav_dsp,X0d24 clr pin_dsp_busy reti ; X0d24: dec r3 cjne r3,#0,dac_2_process_sample cjne r5,#0,X0d44 cjne r6,#0,X0d43 mov a,misc_flags anl a,#7 rl a mov dptr,#dac2_isr_jump_table jmp @a+dptr ; dac2_default_isr: clr flag_dma_dac_2 ajmp finished_dma_op ; dac2_auto_once_isr: mov r3,#4 ajmp prep_last_autoinit_dma_adpcm ; dac2_auto_init_isr: mov r3,#4 ajmp prep_next_autoinit_dma_adpcm ; X0d43: dec r6 X0d44: dec r5 mov r3,#4 setb pin_drequest clr pin_drequest X0d4b: jnb pin_dav_dsp,X0d4b movx a,@r0 mov adpcm_buf,a dac_2_process_sample: mov a,adpcm_buf rl a rl a mov adpcm_buf,a mov a,r7 anl a,#7 swap a jnb adpcm_buf.0,X0d60 setb acc.0 X0d60: mov dptr,#adpcm_table movc a,@a+dptr jb adpcm_buf.1,X0d6e add a,r2 jnc X0d74 mov a,#0ffh sjmp X0d74 ; X0d6e: xch a,r2 clr c subb a,r2 jnc X0d74 clr a X0d74: mov r2,a mov port_dac_out,a jnb adpcm_buf.0,X0d84 cjne r7,#5,X0d80 clr pin_dsp_busy reti ; X0d80: inc r7 clr pin_dsp_busy reti ; X0d84: cjne r7,#0,X0d8a clr pin_dsp_busy reti ; X0d8a: dec r7 clr pin_dsp_busy reti ; isr_dma_dac_4: jnb pin_dav_dsp,X0d94 clr pin_dsp_busy reti ; X0d94: dec r3 cjne r3,#0,dac_4_process_sample cjne r5,#0,X0db4 cjne r6,#0,X0db3 mov a,misc_flags anl a,#7 rl a mov dptr,#dac4_isr_jump_table jmp @a+dptr ; dac4_default_isr: clr flag_dma_dac_4 ajmp finished_dma_op ; dac4_auto_once_isr: mov r3,#2 ajmp prep_last_autoinit_dma_adpcm ; dac4_auto_init_isr: mov r3,#2 ajmp prep_next_autoinit_dma_adpcm ; X0db3: dec r6 X0db4: dec r5 mov r3,#2 setb pin_drequest clr pin_drequest X0dbb: jnb pin_dav_dsp,X0dbb movx a,@r0 mov adpcm_buf,a dac_4_process_sample: mov a,adpcm_buf swap a mov adpcm_buf,a anl a,#7 mov adpcm_mag,a mov a,r7 anl a,#3 swap a orl a,adpcm_mag mov dptr,#adpcm_table movc a,@a+dptr jb adpcm_buf.3,X0dde add a,r2 jnc X0de4 mov a,#0ffh sjmp X0de4 ; X0dde: xch a,r2 clr c subb a,r2 jnc X0de4 clr a X0de4: mov r2,a mov port_dac_out,a mov a,adpcm_mag jz X0dfa cjne a,#5,X0dee X0dee: jc X0df3 cjne r7,#3,X0df6 X0df3: clr pin_dsp_busy reti ; X0df6: inc r7 clr pin_dsp_busy reti ; X0dfa: cjne r7,#0,X0e00 clr pin_dsp_busy reti ; X0e00: dec r7 clr pin_dsp_busy reti ; isr_dma_dac_26: jnb pin_dav_dsp,X0e0a clr pin_dsp_busy reti ; X0e0a: dec r3 cjne r3,#0,dac_26_process_sample cjne r5,#0,X0e2a cjne r6,#0,X0e29 mov a,misc_flags anl a,#7 rl a mov dptr,#dac26_isr_jump_table jmp @a+dptr ; dac26_default_isr: clr flag_dma_dac_26 ajmp finished_dma_op ; dac26_auto_once_isr: mov r3,#3 ajmp prep_last_autoinit_dma_adpcm ; dac26_auto_init_isr: mov r3,#3 ajmp prep_next_autoinit_dma_adpcm ; X0e29: dec r6 X0e2a: dec r5 mov r3,#3 setb pin_drequest clr pin_drequest X0e31: jnb pin_dav_dsp,X0e31 movx a,@r0 mov adpcm_buf,a dac_26_process_sample: mov a,adpcm_buf mov adpcm_sign,a rl a rl a cjne r3,#1,X0e44 anl a,#1 sjmp X0e49 ; X0e44: rl a mov adpcm_buf,a anl a,#3 X0e49: mov adpcm_mag,a mov a,r7 anl a,#7 swap a orl a,adpcm_mag mov dptr,#adpcm_table movc a,@a+dptr jb adpcm_sign.7,X0e5f add a,r2 jnc X0e65 mov a,#0ffh sjmp X0e65 ; X0e5f: xch a,r2 clr c subb a,r2 jnc X0e65 clr a X0e65: mov r2,a mov port_dac_out,a mov a,adpcm_mag jz X0e79 cjne a,#3,X0e72 cjne r7,#4,X0e75 X0e72: clr pin_dsp_busy reti ; X0e75: inc r7 clr pin_dsp_busy reti ; X0e79: cjne r7,#0,X0e7f clr pin_dsp_busy reti ; X0e7f: dec r7 clr pin_dsp_busy reti ; isr_dma_adc_8: jnb pin_dav_dsp,X0e89 clr pin_dsp_busy reti ; X0e89: lcall get_adc_sample setb pin_drequest clr pin_drequest cjne r5,#0,X0eb8 cjne r6,#0,X0eb7 mov a,misc_flags anl a,#7 rl a mov dptr,#adc8_isr_jump_table jmp @a+dptr ; adc8_default_isr: clr misc_flags.2 clr misc_flags.0 clr misc_flags.1 clr et0 clr tr0 X0ea9: jb pin_dav_pc,X0ea9 clr pin_irequest setb pin_irequest clr 21h.2 setb pin_dma_enablel clr pin_dsp_busy reti ; X0eb7: dec r6 X0eb8: dec r5 clr pin_dsp_busy reti ; isr_silence_gen: jnb pin_dav_dsp,X0ec2 clr pin_dsp_busy reti ; X0ec2: cjne r5,#0,X0ed8 cjne r6,#0,X0ed7 clr flag_dac_silenc clr et0 clr tr0 clr pin_irequest setb pin_irequest setb pin_dma_enablel clr pin_dsp_busy reti ; X0ed7: dec r6 X0ed8: dec r5 clr pin_dsp_busy reti ; isr_sine_gen: mov a,@r1 mov port_dac_out,a mov a,r6 add a,r1 cjne a,#80h,X0ee4 X0ee4: jc X0ee8 mov a,#40h X0ee8: mov r1,a clr pin_dsp_busy nop ; Next, this clever trick executes part of the copyright. add a,r0 ; '(' orl 29h,#31h ; 'C)1' addc a,r1 ; '9' addc a,r1 ; '9' reti ; '2' (only this instruction does anything) ; .db " Anchor Electronics Co.," .db 0 .db 0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .org 0f80h sine_table: .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh .db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh ; ; ; .org 0fc0h ; .db 80h,8ch,98h,0a4h,0b0h,0bbh,0c6h,0d0h .db 0d9h,0e2h,0e9h,0f0h,0f5h,0f9h,0fch,0feh .db 0ffh,0feh,0fch,0f9h,0f5h,0f0h,0e9h,0e2h .db 0d9h,0d0h,0c6h,0bbh,0b0h,0a4h,98h,8ch .db 80h,73h,67h,5bh,4fh,44h,39h,2fh .db 26h,1dh,16h,0fh,0ah,6,3,1 .db 1,1,3,6,0ah,0fh,16h,1dh .db 26h,2fh,39h,44h,4fh,5bh,67h,73h ;